
#region license
/// Copyright (c) 2007 Rodrigo B. de Oliveira, Jb Evain and the
/// individuals listed on the ChangeLog entries.
/// 
/// Permission is hereby granted, free of charge, to any person obtaining
/// a copy of this software and associated documentation files (the
/// "Software"), to deal in the Software without restriction, including
/// without limitation the rights to use, copy, modify, merge, publish,
/// distribute, sublicense, and/or sell copies of the Software, and to
/// permit persons to whom the Software is furnished to do so, subject to
/// the following conditions:
/// 
/// The above copyright notice and this permission notice shall be
/// included in all copies or substantial portions of the Software.
/// 
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
/// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
/// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
/// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
/// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
/// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
/// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#endregion

namespace Milo.Ast
{
	using System;

	[System.Xml.Serialization.XmlInclude(typeof(DeclarationStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(TryStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(IfStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(UnlessStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(ForStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(WhileStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(BreakStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(ContinueStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(ReturnStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(YieldStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(RaiseStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(UnpackStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(ExpressionStatement))]
	[System.Xml.Serialization.XmlInclude(typeof(MacroStatement))]
	public abstract partial class Statement
	{
		public static Statement Lift(Statement node)
		{
			return node;
		}

		public static Statement Lift(Expression node)
		{
			return new ExpressionStatement(node);
		}

		public Statement()
		{
		}

		public Statement(StatementModifier modifier)
		{
			this.Modifier = modifier;
		}

		public Statement(LexicalInfo lexicalInfoProvider)
			: base(lexicalInfoProvider)
		{
		}

		public virtual Block ToBlock()
		{
			Block b = new Block(LexicalInfo);
			b.Add(this);
			return b;
		}

		public void ReplaceBy(Statement other)
		{
			Block block = (Block)ParentNode;
			if (null == block)
			{
				throw new InvalidOperationException();
			}

			block.Statements.Replace(this, other);
		}
	}

}

